#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=100050;
const ll INF=0x3f3f3f3f3f3f3f3f;
ll mw[40],sw[40];
ll tmp[8];
int t;
int n,m,k;
int main(void){
    scanf("%d",&t);
    while(t--){
        scanf("%d%d%d",&n,&m,&k);
        //题目会出现负数，因此要初始化为-INF
        for(int i=0;i<40;i++){
            mw[i]=-INF;
            sw[i]=-INF;
        }
        //每次计算一个主武器的值（包括主属性和副属性（或加或减，通过二进制位进行状态压缩，找出最大值））
        for(int i=0;i<n;i++){
            //主武器的主属性
            ll val;
            scanf("%lld",&val);
            for(int j=0;j<k;j++){
                scanf("%lld",&tmp[j]);
            }
            //读取
            for(int j=0;j<(1<<k);j++){
                ll cnt=val;
                //状态压缩，有2^k种状态
                for(int t=0;t<k;t++){
                    //如果该位是1,则加上副属性，否则减
                    if((j>>t)&1){
                        cnt+=tmp[t];
                    }
                    else{
                        cnt-=tmp[t];
                    }
                }
                //更新主武器（所有）在j状态（即某些副属性加，某些减）下的最大值
                mw[j]=max(mw[j],cnt);
            }
        }
        for(int i=0;i<m;i++){
            ll val;
            scanf("%lld",&val);
            for(int j=0;j<k;j++){
                scanf("%lld",&tmp[j]);
            }
            for(int j=0;j<(1<<k);j++){
                ll cnt=val;
                for(int t=0;t<k;t++){
                    if((j>>t)&1){
                        cnt+=tmp[t];
                    }
                    else{
                        cnt-=tmp[t];
                    }
                }
                sw[j]=max(sw[j],cnt);
            }
        }
        //考虑负数值
        ll _max=-INF;
        //枚举主武器和副武器状态相反的状态
        for(int i=0;i<(1<<k);i++){
            _max=max(_max,mw[i]+sw[(1<<k)-i-1]);
        }
        printf("%lld\n",_max);
    }
    return 0;
}